/**
 * 
 */
package com.android.fxcontacts.ui;

import com.android.fxcontacts.R;

import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;

/**
 * Manages user preferences for contacts.
 * 
 */
public final class ContactsPreferences
{
	/**
	 * A key in the android.provider.Settings provider that stores the preferred
	 * display order for contacts (given name first vs. family name first).
	 */
	public static final String DISPLAY_ORDER = "android.contacts.DISPLAY_ORDER";
	/**
	 * The value for the DISPLAY_ORDER key corresponding to showing the family
	 * name first.
	 */
	public static final int DISPLAY_ORDER_ALTERNATIVE = 2;
	/**
	 * The value for the DISPLAY_ORDER key corresponding to showing the given
	 * name first.
	 */
	public static final int DISPLAY_ORDER_PRIMARY = 1;
	/**
	 * A key in the android.provider.Settings provider that stores the preferred
	 * sorting order for contacts (by given name vs. by family name).
	 */
	public static final String SORT_ORDER = "android.contacts.SORT_ORDER";
	/**
	 * The value for the SORT_ORDER key corresponding to sorting by family name
	 * first.
	 */
	public static final int SORT_ORDER_ALTERNATIVE = 2;
	/**
	 * The value for the SORT_ORDER key corresponding to sorting by given name
	 * first.
	 */
	public static final int SORT_ORDER_PRIMARY = 1;

	private Context mContext;
	private ContentResolver mContentResolver;
	private int mSortOrder = -1;
	private int mDisplayOrder = -1;
	private SettingsObserver mSettingsObserver;

	public ContactsPreferences(Context context)
	{
		mContext = context;
		mContentResolver = context.getContentResolver();

		mSettingsObserver = new SettingsObserver();
		mSettingsObserver.register();
	}

	public boolean isSortOrderUserChangeable()
	{
		return mContext.getResources().getBoolean(
				R.bool.config_sort_order_user_changeable);
	}

	private int getDefaultSortOrder()
	{
		if (mContext.getResources().getBoolean(
				R.bool.config_default_sort_order_primary))
		{
			return SORT_ORDER_PRIMARY;
		} else
		{
			return SORT_ORDER_ALTERNATIVE;
		}
	}

	public int getSortOrder()
	{
		if (!isSortOrderUserChangeable())
		{
			return getDefaultSortOrder();
		}

		if (mSortOrder == -1)
		{
			try
			{
				mSortOrder = Settings.System.getInt(mContext
						.getContentResolver(), SORT_ORDER);
			} catch (SettingNotFoundException e)
			{
				mSortOrder = getDefaultSortOrder();
			}
		}
		return mSortOrder;
	}

	public void setSortOrder(int sortOrder)
	{
		mSortOrder = sortOrder;
		Settings.System.putInt(mContext.getContentResolver(), SORT_ORDER,
				sortOrder);
	}

	public boolean isDisplayOrderUserChangeable()
	{
		return mContext.getResources().getBoolean(
				R.bool.config_display_order_user_changeable);
	}

	private int getDefaultDisplayOrder()
	{
		if (mContext.getResources().getBoolean(
				R.bool.config_default_display_order_primary))
		{
			return DISPLAY_ORDER_PRIMARY;
		} else
		{
			return DISPLAY_ORDER_ALTERNATIVE;
		}
	}

	public int getDisplayOrder()
	{
		if (!isDisplayOrderUserChangeable())
		{
			return getDefaultDisplayOrder();
		}

		if (mDisplayOrder == -1)
		{
			try
			{
				mDisplayOrder = Settings.System.getInt(mContext
						.getContentResolver(), DISPLAY_ORDER);
			} catch (SettingNotFoundException e)
			{
				mDisplayOrder = getDefaultDisplayOrder();
			}
		}
		return mDisplayOrder;
	}

	public void setDisplayOrder(int displayOrder)
	{
		mDisplayOrder = displayOrder;
		Settings.System.putInt(mContext.getContentResolver(), DISPLAY_ORDER,
				displayOrder);
	}

	private class SettingsObserver extends ContentObserver
	{

		public SettingsObserver()
		{
			super(null);
		}

		public void register()
		{
			mContentResolver.registerContentObserver(Settings.System
					.getUriFor(SORT_ORDER), false, this);
			mContentResolver.registerContentObserver(Settings.System
					.getUriFor(DISPLAY_ORDER), false, this);
		}

		@Override
		public void onChange(boolean selfChange)
		{
			mSortOrder = -1;
			mDisplayOrder = -1;

			// TODO send a message to parent context to notify of the change
		}
	}

}
